package com.vegetable.modules.service.finance;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vegetable.modules.entity.baseData.FundAccount;
import com.vegetable.modules.service.baseData.IFundAccountService;
import com.vegetable.modules.service.wx.WxCpMessageService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 资金账户余额Markdown消息定时任务
 * 每天晚上9点统计账户余额并发送Markdown消息到企业微信
 *
 * @author Qoder
 */
@Slf4j
@Component
public class FundAccountBalanceMarkdownScheduledTask {

    @Autowired
    private IFundAccountService fundAccountService;

    @Autowired
    private WxCpMessageService wxCpMessageService;

    // 企业微信管理员用户ID，多个用户用|分隔
    @Value("${wechat.cp.admin.userIds}")
    private String adminUserIds;

    /**
     * 每天晚上9点执行资金账户余额统计并推送Markdown消息到企业微信
     */
    public void pushFundAccountBalanceMarkdownReport() {
        try {
            log.info("开始执行资金账户余额Markdown消息统计任务");
            
            // 获取所有未删除的资金账户
            List<FundAccount> fundAccounts = fundAccountService.list(new QueryWrapper<FundAccount>()
                    .eq("is_del", 0));
            
            if (fundAccounts != null && !fundAccounts.isEmpty()) {
                // 创建Markdown消息
                String markdownContent = createFundAccountBalanceMarkdown(fundAccounts);
                
                // 推送数据到企业微信管理员
                String[] userIds = adminUserIds.split("\\|");
                
                for (String userId : userIds) {
                    try {
                        boolean result = wxCpMessageService.sendMarkdownMessageToUser(userId.trim(), markdownContent);
                        if (result) {
                            log.info("资金账户余额Markdown报告已推送到企业微信用户: {}", userId);
                        } else {
                            log.error("推送资金账户余额Markdown报告到企业微信用户失败: {}", userId);
                        }
                    } catch (WxErrorException e) {
                        log.error("推送资金账户余额Markdown报告到企业微信用户失败: {}", userId, e);
                    }
                }
            } else {
                log.warn("未找到有效的资金账户数据");
            }
        } catch (Exception e) {
            log.error("执行资金账户余额Markdown统计任务时发生异常", e);
        }
    }

    /**
     * 创建资金账户余额Markdown消息
     *
     * @param fundAccounts 资金账户列表
     * @return Markdown消息内容
     */
    private String createFundAccountBalanceMarkdown(List<FundAccount> fundAccounts) {
        StringBuilder markdown = new StringBuilder();
        
        // 标题
        markdown.append("# 资金账户余额日报\n\n");
        
        // 统计时间
        markdown.append("**统计时间**: ").append(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))).append("\n\n");
        
        // 过滤掉微信(1)和支付宝(2)的账户
        List<FundAccount> filteredAccounts = fundAccounts.stream()
                .filter(account -> account.getAccountType() != null && 
                        account.getAccountType() != 1 && // 微信
                        account.getAccountType() != 2)   // 支付宝
                .collect(Collectors.toList());
        
        // 账户总数（仅显示过滤后的账户数量）
        markdown.append("**账户总数**: ").append(filteredAccounts.size()).append("个\n\n");
        
        // 总余额统计（仅统计过滤后的账户）
        BigDecimal totalBalance = filteredAccounts.stream()
                .map(FundAccount::getTotalBalance)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        
        markdown.append("**账户总余额**: ").append(totalBalance != null ? totalBalance.setScale(2, BigDecimal.ROUND_HALF_UP).toString() : "0.00").append("元\n\n");
        
        // 表格标题 (只显示账户名称和当前余额)
        markdown.append("| 账户名称 | 当前余额(元) |\n");
        markdown.append("| :------ | :------ |\n");
        
        // 各账户详细信息 (只显示账户名称和当前余额)
        for (FundAccount account : filteredAccounts) {
            markdown.append("| ")
                    .append(account.getAccountName() != null ? account.getAccountName() : "无")
                    .append(" | ")
                    .append(account.getTotalBalance() != null ? 
                            account.getTotalBalance().setScale(2, BigDecimal.ROUND_HALF_UP).toString() : "0.00")
                    .append(" |\n");
        }
        
        return markdown.toString();
    }

    /**
     * 获取账户类型名称
     *
     * @param accountType 账户类型代码
     * @return 账户类型名称
     */
    private String getAccountTypeName(Integer accountType) {
        if (accountType == null) return "未知类型";
        
        switch (accountType) {
            case 0: return "现金";
            case 1: return "微信";
            case 2: return "支付宝";
            case 3: return "中国银行卡";
            case 4: return "建设银行";
            case 5: return "农业银行";
            case 6: return "工商银行";
            case 7: return "潍坊银行";
            case 8: return "农村信用社";
            case 9: return "邮政储蓄";
            default: return "其他银行";
        }
    }
}